# 2024/2/1 19:15 HFL
import json
import requests


class HttpRequests(object):

    def __init__(self):
        '''
        实际工作中，我们会经常遇到需要保持某一个状态，才能测试后续的接口，比如说：充值接口，  那么需要用户先登录，且一直保持登录状态才能进行充值，那么对于这种情况该怎么解决呢？这就要用到requests库中的Session类了，Session可以保持请求的状态
        '''
        self.session = requests.Session()

    def send_request(self, method, url, params_type='form', data=None, **kwargs):
        method = method.upper()  # 把传进来的值转换为大写
        params_type = params_type.upper()
        if isinstance(data, str):
            try:
                data = json.loads(data)
            except Exception:
                data = eval(data)
        if 'GET' == method:
            response = self.session.request(method=method, url=url, params=data, **kwargs)
        elif 'POST' == method:
            if params_type == 'FORM':  # 发送表单数据，使用data参数传递
                response = self.session.request(method=method, url=url, data=data, **kwargs)
            elif params_type == 'JSON':  # 如果接口支持application/json类型，则使用json参数传递
                response = self.session.request(method=method, url=url, json=data, **kwargs)
            else:  # 如果接口需要传递其他类型的数据比如 上传文件，调用下面的请求方法
                response = self.session.request(method=method, url=url, **kwargs)
        # 如果请求方式非 get 和post 会报错，当然你也可以继续添加其他的请求方法
        else:
            raise ValueError('request method "{}" error ! please check'.format(method))
        return response

    def __call__(self, method, url, params_type='form', data=None, **kwargs):
        return self.send_request(method, url,
                                 params_type=params_type,
                                 data=data,
                                 **kwargs)

    def close_session(self):
        self.session.close()
        try:
            del self.session.cookies['JSESSIONID']
        except:
            pass

